/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙，邂逅框架梦]
 * 
 * https://zhiqim.org/project/zhiqim_framework/zhiqim_httpd.htm
 *
 * Zhiqim Httpd is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package org.zhiqim.httpd;

import java.util.List;

import org.zhiqim.httpd.model.HttpDomainPortPath;
import org.zhiqim.kernel.paging.PageResult;

/**
 * HTTP会话管理器接口<br><br>
 * 1.要求实现启动方法<br>
 * 2.设置会话值<br>
 * 3.获取会话值<br>
 * 4.删除会话值<br>
 * 5.遍历会话值
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
public interface HttpSessionManager extends HttpdConstants
{
    /******************************************************************************************/
    //上下文环境关联
    /******************************************************************************************/
    
    /** 设置上下文环境对象 */
    public void setContext(HttpContext context);
    
    /** 获取上下文环境对象 */
    public HttpContext getContext();
    
    /******************************************************************************************/
    //开启和关闭
    /******************************************************************************************/
    
    /** 开启会话管理 */
    public void open();
    
    /** 关闭会话管理 */
    public void close();
    
    /******************************************************************************************/
    //设置参数部分
    /******************************************************************************************/
    
    /** 设置会话超时时长 */
    public void setSessionTimeout(int sessionTimeout);
    
    /** 获取会话超时时长 */
    public int getSessionTimeout();

    /** 设置会话编号名称 */
    public void setSessionIdName(String sessionIdName);
    
    /** 获取会话编号名称 */
    public String getSessionIdName();
    
    /** 设置会话编号标记 */
    public void setSessionIdMark(String sessionIdMark);
    
    /** 判断是否会话编号标记 */
    public boolean chkSessionIdMark(String mark, HttpDomainPortPath domainPortPath);
    
    /** 设置会话必需 */
    public void setSessionMust(String sessionMust);
    
    /** 设置会话无需 */
    public void setSessionNot(String sessionNot);
    
    /** 设置会话参数 */
    public void setSessionParameter(String sessionParameter);
    
    /******************************************************************************************/
    //新建 & 保存 & 获取 & 失效 更新会话
    /******************************************************************************************/
    
    /** 是否是需要会话 */
    public boolean needSession(String path);
    
    /** 新建会话 */
    public HttpSession newSession(HttpDomainPortPath domainPortPath, String sessionIp, String userAgent);
    
    /** 保存会话 */
    public void setSession(HttpSession session);
    
    /** 获取会话 */
    public HttpSession getSession(String sessionId);
    
    /** 判断会话是否存在 */
    public boolean hasSession(String sessionId);
    
    /** 通过会话编号使会话失效 */
    public void invalidateSession(String sessionId);
    
    /** 更新会话最后访问时间 */
    public void updateLastAccessed(String sessionId);
    
    /** 更新会话信息 */
    public void updateInfo(String sessionId, String sessionIp, String userAgent);
    
    /** 更新会话并返回会话 */
    public HttpSession getSessionByUpdate(String sessionId, String sessionIp, String userAgent);
    
    /******************************************************************************************/
    //会话查询和统计
    /******************************************************************************************/
    
    /** 会话数 */
    public int size();
    
    /** 获取会话列表 */
    public List<HttpSession> getSessionList();
    
    /** 获取会话分页信息 */
    public PageResult<HttpSession> getSessionPage(int pageNo, int pageSize);
    
    /******************************************************************************************/
    //会话用户查询和统计
    /******************************************************************************************/
    
    /** 会话登录数 */
    public int sizeUser();
    
    /** 是否有会话名称对应的会话 */
    public boolean hasSessionName(String sessionName);
    
    /** 获取会话登录用户列表，指定会话用户类名（如前后端共用session管理器的情况） */
    public List<HttpSessionUser> getSessionUserList();
    
    /** 获取会话登录用户分页信息，指定会话用户类名（如前后端共用session管理器的情况） */
    public PageResult<HttpSessionUser> getSessionUserPage(int pageNo, int pageSize);
}
